package org.apli.haiam.admin.jsf.managed;

import com.apli.controladores.AplinfoFactoryBean;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Objects;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmPermiso;
import org.apli.haiam.ejb.entidades.AdmRol;
import org.apli.haiam.ejb.entidades.AdmTipoConsulta;
import org.apli.haiam.ejb.entidades.AdmUsuario;
import org.apli.haiam.ejb.entidades.CexAgenda;
import org.apli.haiam.ejb.entidades.CexAntecedentesFamiliares;
import org.apli.haiam.ejb.entidades.CexAntecedentesPatologicos;
import org.apli.haiam.ejb.entidades.CexConsulta;
import org.apli.haiam.ejb.entidades.CexDiagnostico;
import org.apli.haiam.ejb.entidades.CexDiagnosticoConsulta;
import org.apli.haiam.ejb.entidades.CexEspecialidadMedico;
import org.apli.haiam.ejb.entidades.CexExamenFisico;
import org.apli.haiam.ejb.entidades.CexFisicoRegional;
import org.apli.haiam.ejb.entidades.CexGeriatricoConsulta;
import org.apli.haiam.ejb.entidades.CexGrupoAtencion;
import org.apli.haiam.ejb.entidades.CexHorario;
import org.apli.haiam.ejb.entidades.CexHorariosDia;
import org.apli.haiam.ejb.entidades.CexPatologia;
import org.apli.haiam.ejb.entidades.CexPedidoLaboratorio;
import org.apli.haiam.ejb.entidades.CexPreparacion;
import org.apli.haiam.ejb.entidades.CexRevisionOrganos;
import org.apli.haiam.ejb.entidades.CexSindromeGeriatrico;
import org.apli.haiam.ejb.entidades.CexSistemasOrganos;
import org.apli.haiam.ejb.entidades.CexTipoExamenLaboratorio;
import org.apli.haiam.ejb.entidades.CexTratamientoConsulta;
import org.apli.haiam.ejb.interfaces.AdministradorHaiam;
import org.apli.haiam.ejb.interfaces.ConsExternaAdministrador;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexConsulta.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfAtencion extends JsfBean<CexConsulta> {

    final Logger log = LoggerFactory.getLogger(JsfAtencion.class);
    private List<CexPreparacion> listaDetalle;
    private UsuarioAdmin user;
    private AdmUsuario usuario;
    private List<CexRevisionOrganos> listaOrganos;
    private List<CexExamenFisico> listaFisico;
    private CexDiagnosticoConsulta diagnostico1;
    private List<CexDiagnosticoConsulta> listaDiagnostico;
    private CexPreparacion preparacion;
    private CexTratamientoConsulta procedimiento;
    private List<CexTratamientoConsulta> listaProcedimiento;
    private List<CexAntecedentesPatologicos> listaPatologia;
    private List<CexAntecedentesFamiliares> listaPatologiaF;
    private String busquedaDiagnostico;
    private int tipoBusquedaDiagnostico;
    private List<CexDiagnostico> listadiagnosticoPopup;
    private Date fecha;
    private Date fechaCita;
    private Date fechaPedidoLab;
    private List<CexHorariosDia> listaHorarioDia;
    private CexEspecialidadMedico objEspecialidadMedico;
    private List<CexEspecialidadMedico> listaEspecialidadMedico;
    private List<CexHorariosDia> listObjHorarioDia;
    private List<CexGrupoAtencion> listaGrupoAtencion;
    private CexGrupoAtencion grupoAtencion;
    private boolean isDiagPrincipal;
    private List<CexAgenda> listaAgenda;
    private long diffMinutes;
    private BigDecimal rangoMuinutos;
    private Calendar horaInicioAm;
    private Calendar horaFinAm;
    private Integer turnosLibres;
    private boolean isGrabar;
    private ConsExternaAdministrador hcAdmin;
    private boolean isPrevencion;
    private List<CexConsulta> listaAtencionPopup;
    private CexConsulta anteriorConsulta;
    private boolean isVisualizar;
    private boolean isAdmin;
    private AdmTipoConsulta admTipoConsulta;
    private Calendar fecAct;
    private Integer dia;
    private CexFisicoRegional cexFisicoRegional;
    private List<CexSindromeGeriatrico> listaSindromeGeriatrico;
    private List<CexGeriatricoConsulta> listaGeriatricoconsulta;
    private List<CexSindromeGeriatrico> listaGeriatricoHistorial;
    private CexSindromeGeriatrico sindromeGer;
    private List<CexSistemasOrganos> listaSistemasOrganos;
    private List<CexPatologia> listaPatPadres;
    private List<CexFisicoRegional> listaFisPadres;
    private List<CexFisicoRegional> listaFisHijos;
    private List<CexPatologia> listaPatHijos;
    private List<CexPatologia> listaFamHijos;
    private List<CexPatologia> listaFam;
    private CexAgenda agenda;
    private CexPedidoLaboratorio cexPedidoLaboratorio;
    private List<CexTipoExamenLaboratorio> listaExamenLaboratorio;

    /**
     * Constructor por defecto.
     */
    public JsfAtencion() {
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        // setSwGrabar(false);
        object = new CexConsulta();
        object.setCcoRenova(false);
        //object.setCexExamenFisicoList(new ArrayList<CexExamenFisico>());
        listaDetalle = new ArrayList<>();
        //preparacion = new CexPreparacion();
        user = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
        usuario = user.getUser();
        listaOrganos = new ArrayList<>();
        listaFisico = new ArrayList<>();
        busquedaDiagnostico = null;
        tipoBusquedaDiagnostico = 1;
        diagnostico1 = new CexDiagnosticoConsulta();
        listaDiagnostico = new ArrayList<>();
        diagnostico1.setDicPrevencion(0);
        diagnostico1.setDicMorbilidad(0);
        cexFisicoRegional = new CexFisicoRegional();
        procedimiento = new CexTratamientoConsulta();
        listaProcedimiento = new ArrayList<>();
        listaPatologia = new ArrayList<>();
        listaPatologiaF = new ArrayList<>();
        listadiagnosticoPopup = null;
        isDiagPrincipal = false;
        listaGrupoAtencion = new ArrayList<>();
        listaAgenda = new ArrayList<>();
        rangoMuinutos = BigDecimal.ZERO;
        diffMinutes = 0;
        horaInicioAm = new GregorianCalendar();
        horaFinAm = new GregorianCalendar();
        turnosLibres = 0;
        isGrabar = false;
        listObjHorarioDia = new ArrayList<>();
        isPrevencion = true;
        listaAtencionPopup = new ArrayList<>();
        //anteriorConsulta = new CexConsulta();
        isVisualizar = false;
        listaEspecialidadMedico = new ArrayList<>();
        isAdmin = false;
        fecAct = Calendar.getInstance();
        listaGeriatricoconsulta = new ArrayList<>();
        sindromeGer = new CexSindromeGeriatrico();
        listaGeriatricoHistorial = new ArrayList<>();
        listaHorarioDia = new ArrayList<>();
        agenda = new CexAgenda();
        cexPedidoLaboratorio = new CexPedidoLaboratorio();
        try {
            fecha = admin.getFechaDb();
            fechaCita = fecha;
            fechaPedidoLab = fecha;
            admTipoConsulta = (AdmTipoConsulta) adminObject.buscar(AdmTipoConsulta.class, "atcId", 1);
            listaSindromeGeriatrico = adminObject.listar(CexSindromeGeriatrico.class, "csgTipoPregunta", 0, "csgEstado", 1);
            listaGeriatricoHistorial = listaSindromeGeriatrico;
            object.setCcoIdUsuario(user.getUser().getIdUsuario());
            if (user.getUser().getAdmMedico() != null) {
                object.setCcoNombreUsuario(user.getUser().getAdmMedico().getAmeNombreFull());
            } else {
                object.setCcoNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
            }
            //Cargar lista de sistemas
            listaSistemasOrganos = adminObject.listar(CexSistemasOrganos.class);
            listaFam = adminObject.listarNull(CexPatologia.class, "cexPatologia", "cptTipo", 2);
            listaPatPadres = adminObject.listarNull(CexPatologia.class, "cexPatologia", "cptTipo", 1);
            listaFisPadres = adminObject.listarNull(CexFisicoRegional.class, "cexFisicoRegional");
            listaFisHijos = adminObject.listarNotNull(CexFisicoRegional.class, "cexFisicoRegional");
            listaPatHijos = adminObject.listarNotNull(CexPatologia.class, "cexPatologia", "cptTipo", 1);
            listaFamHijos = adminObject.listarNotNull(CexPatologia.class, "cexPatologia", "cptTipo", 2);
            //Lista de examenes de laboratorio
            listaExamenLaboratorio = adminObject.listarNullOrdenada(CexTipoExamenLaboratorio.class, "cexTipoExamenLaboratorio", "ctlOrden", true);
        } catch (Exception e) {
            log.error("recuperar fecha() {} ", e.getMessage());
        }

        objEspecialidadMedico = new CexEspecialidadMedico();
        grupoAtencion = new CexGrupoAtencion();
////////////////////        listaGeriatricoConsulta = new ArrayList<>();

        //Agregar subespecialidad
        cargarSubespecialidades();
        //cargarListaExamenes();

    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();

        try {

            // verificar si en caso de ingresar frm 057 se llenan todas las listas
            if (object.getCcoRenova()) {
                // lista revision organos
                if (listaOrganos != null) {
                    for (CexRevisionOrganos objRevOrg : listaOrganos) {
                        if (objRevOrg.getCroId() == null) {
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo concluir la atención", "Grabe revisioón de sistemas y órganos"));
                            return null;
                        }
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo concluir la atención", "Grabe revisioón de sistemas y órganos"));
                    return null;
                }

                //lista de antecedentes personales
                if (listaPatologia != null) {
                    for (CexAntecedentesPatologicos cexAntPa : listaPatologia) {
                        for (CexAntecedentesPatologicos cexAntHijos : cexAntPa.getListaHijos()) {
                            if (cexAntHijos.getCapId() == null) {
                                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo concluir la atención", "Grabe antecedentes personales"));
                                return null;
                            }
                        }
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo concluir la atención", "Grabe antecedentes personales"));
                    return null;
                }

                //lista de antecedentes familiares
                if (listaPatologiaF != null) {
                    for (CexAntecedentesFamiliares cexAntFa : listaPatologiaF) {
                        for (CexAntecedentesFamiliares cexAntHijosFa : cexAntFa.getListaHijos()) {
                            if (cexAntHijosFa.getCafId() == null) {
                                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo concluir la atención", "Grabe antecedentes familiares"));
                                return null;
                            }
                        }
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo concluir la atención", "Grabe antecedentes familiares"));
                    return null;
                }

                //lista de fisico regional
                if (listaFisico != null) {
                    for (CexExamenFisico cexFis : listaFisico) {
                        for (CexExamenFisico cexAntHijosEx : cexFis.getListaHijos()) {
                            if (cexAntHijosEx.getCfcId() == null) {
                                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo concluir la atención", "Grabe exámen físico"));
                                return null;
                            }
                        }
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo concluir la atención", "Grabe exámen físico"));
                    return null;
                }
            }

            // 
            if (listaDiagnostico != null) {
                for (CexDiagnosticoConsulta obj : listaDiagnostico) {
                    if (obj.getDicId() == null) {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se puede grabar la consulta", "No ha agregado diagnostico a la consulta"));
                        return null;
                    }
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se puede grabar la consulta", "No ha agregado diagnostico a la consulta"));
                return null;
            }
            if (preparacion.getCprId() != null) {
                if (object.getCcoId() != null) {
                    try {
                        object.setCcoEstado(1);
                        object.setCcoFechaFinAtencion(fecha);
                        object.setCcoHoraFinAtencion(admin.getFechaDb());
                        hcAdmin.concluirConsulta(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        inicializar();
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Se culmino la atención del paciente correctamente", "Se culmino la atención del paciente correctamente"));
                    } catch (Exception e) {
                        log.error("grabarAction() {} ", e.getMessage());
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se puede grabar la consulta", "No ha grabado ningun item de la atención"));
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se puede grabar la consulta", "Debe seleccionar un paciente"));
            }

        } catch (Exception e) {
            log.error("grabarAction() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        return null;
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @param mensaje
     * @param isMsg
     * @return null, se mantiene en la página invocada.
     */
    public String grabarAction(String mensaje, boolean isMsg) {
        FacesContext context = FacesContext.getCurrentInstance();
        if (preparacion.getCprId() != null) {
            if (object.getCcoId() == null) {
                try {
                    if (!admin.existePorCampo(CexConsulta.class, "cexPreparacion.cexAgenda.cagFecha", fecha, "cexPreparacion.cexAgenda.cexHistoriaClinica.chcHistoriaClinica", preparacion.getCexAgenda().getCexHistoriaClinica().getChcHistoriaClinica(), "cexPreparacion.cexAgenda.cexHorariosDia.cexHorario.cexEspecialidadMedico", objEspecialidadMedico)) {
                        //Crear la consulta pasando el parametro de preparacion a la consulta y los datos generales
                        agregarDatosGenerales();

                        //object.setCexPreparacion(preparacion);
                        hcAdmin.crearTransaccion(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        if (isMsg) {
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, mensaje + " grabado correctamente", mensaje + " grabado correctamente"));
                        }
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Paciente ya tiene registrada consulta en el dia actual con el mismo médico", "Paciente ya tiene registrada consulta en el dia actual con el mismo médico"));
                        return null;
                    }
                } catch (Exception e) {
                    log.error("grabarAction() {} ", e.getMessage());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                    return null;
                }

            } else {
                try {
                    //  modificar consulta
                    hcAdmin.modificarTransaccion(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                    if (isMsg) {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, mensaje + " modificado correctamente", mensaje + " modificado correctamente"));
                    }
                } catch (Exception e) {
                    log.error("grabarAction() {} ", e.getMessage());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                    return null;
                }

            }
        } else {
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debe seleccionar un paciente", "Debe seleccionar un paciente"));
            return null;
        }

        return null;
    }

    /**
     * Modifica el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String modificarSignosVitales() {

        FacesContext context = FacesContext.getCurrentInstance();
        if (preparacion.getCprId() != null) {
            try {
                //cexHistoriaClinica = hcAgenda.getCexHistoriaClinica();
                //adminObject.modificar(cexHistoriaClinica, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                //object.setCexAgenda(hcAgenda);
                preparacion.setCprObservaciones(preparacion.getCprObservaciones().trim());
                adminObject.modificar(preparacion, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Signos vitales modificados", "Signos vitales modificados"));
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se ha seleccionado paciente", "No se ha seleccionado paciente"));
        }
        return null;
    }

    /**
     * el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String agregarDatosGenerales() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            object.setCcoFecha(fecha);
            object.setCcoHora(admin.getFechaDb());
            object.setCcoIdUsuario(user.getUser().getIdUsuario());
            object.setCcoNombreUsuario(user.getNombreFull());
            object.setCcoEstado(0);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }

        return null;
    }

    /**
     * Graba los datos de la consulta asociado al objeto que se administra en la
     * página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarDatosConsulta() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            object.setCcoEnfermedad(object.getCcoEnfermedad().trim());
            object.setCcoMotivoConsulta(object.getCcoMotivoConsulta().trim());
            grabarAction("Datos consulta", true);
        } catch (Exception e) {
            log.error("grabarAction() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        return null;
    }

    /**
     * Graba los datos de la consulta asociado al objeto que se administra en la
     * página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarDatosConsultaRenova() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            object.setCcoEnfermedadRenova(object.getCcoEnfermedadRenova().trim());
            object.setCcoMotivoConsultaRenova(object.getCcoMotivoConsultaRenova().trim());
            grabarAction("Datos consulta", true);
        } catch (Exception e) {
            log.error("grabarAction() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        return null;
    }

    /**
     * Graba los datos de la consulta asociado al objeto que se administra en la
     * página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarPruebaDiagnostica() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            object.setCcoPruebaDiagnostica(object.getCcoPruebaDiagnostica().trim());
            grabarAction("Pruebas diagnosticas", true);
        } catch (Exception e) {
            log.error("grabarAction() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        return null;
    }

    /**
     * Graba los datos de la evolucion de la consulta asociado al objeto que se
     * administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarDatosEvolucion() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            object.setCcoEvolucion(object.getCcoEvolucion().trim());
            object.setCcoObservacion(object.getCcoObservacion().trim());
            grabarAction("Datos consulta", true);
        } catch (Exception e) {
            log.error("grabarAction() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        return null;
    }

    /**
     * Graba los antecedentes patologicos de la historia clinica asociado al
     * objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarAntecedentesPersonales() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            List<CexAntecedentesPatologicos> listatem = new ArrayList<>();
            if (object.getCcoId() == null) {
                grabarAction(null, false);
            }
            if (preparacion.getCprId() != null) {
                for (CexAntecedentesPatologicos cexAntPa : listaPatologia) {
                    for (CexAntecedentesPatologicos cexAntHijos : cexAntPa.getListaHijos()) {
                        if (cexAntHijos.getCapId() == null) {
                            cexAntHijos.setCexConsulta(object);
                        }
                        listatem.add(cexAntHijos);
                    }
                }
                hcAdmin.grabarListas(CexAntecedentesPatologicos.class, listatem, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Antecedentes personales grabados correctamente", "Antecedentes personales grabados correctamente"));
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se ha seleccionado paciente", "No se ha seleccionado paciente"));
            }

        } catch (Exception e) {
            log.error("grabarAntecedentesPersonales() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        //cargarListaXMedico();

        return null;
    }

    /**
     * Graba los antecedentes familiares de la historia clinica asociado al
     * objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarAntecedentesFamiliares() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            List<CexAntecedentesFamiliares> listatem = new ArrayList<>();
            if (object.getCcoId() == null) {
                grabarAction(null, false);
            }
            if (preparacion.getCprId() != null) {
                for (CexAntecedentesFamiliares cexAntfam : listaPatologiaF) {
                    for (CexAntecedentesFamiliares objHijo : cexAntfam.getListaHijos()) {
                        if (objHijo.getCafId() == null) {
                            objHijo.setCexConsulta(object);
                        }
                        listatem.add(objHijo);
                    }
                }
                hcAdmin.grabarListas(CexAntecedentesFamiliares.class, listatem, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Antecedentes familiares grabados correctamente", "Antecedentes personales grabados correctamente"));
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se ha seleccionado paciente", "No se ha seleccionado paciente"));
            }
        } catch (Exception e) {
            log.error("grabarAntecedentesFamiliares() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        //cargarListaXMedico();

        return null;
    }

    /**
     * Graba los revision de organos de la historia clinica asociado al objeto
     * que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarRevisionOrganos() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            if (object.getCcoId() == null) {
                grabarAction(null, false);
            }
            if (preparacion.getCprId() != null) {
                for (CexRevisionOrganos cexRevi : listaOrganos) {
                    if (cexRevi.getCroId() == null) {
                        cexRevi.setCexConsulta(object);
                    }
                }
                hcAdmin.grabarListas(CexRevisionOrganos.class, listaOrganos, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Revisión de órganos grabados correctamente", "Revisión de órganos grabados correctamente"));
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se ha seleccionado paciente", "No se ha seleccionado paciente"));
            }
        } catch (Exception e) {
            log.error("grabarRevisionOrganos() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        //cargarListaXMedico();

        return null;
    }

    /**
     * Graba los revision de organos de la historia clinica asociado al objeto
     * que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarFisicoRegional() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            List<CexExamenFisico> listaTmp = new ArrayList<>();
            if (object.getCcoId() == null) {
                grabarAction(null, false);
            }
            for (CexExamenFisico cexFis : listaFisico) {
                for (CexExamenFisico objHijos : cexFis.getListaHijos()) {
                    if (objHijos.getCfcId() == null) {
                        objHijos.setCexConsulta(object);
                    }
                    listaTmp.add(objHijos);
                }
            }
            hcAdmin.grabarListas(CexExamenFisico.class, listaTmp, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
            if (object.getCcoId() != null) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Exámen físico regional grabados correctamente", "Exámen físico regional grabados correctamente"));
            }
        } catch (Exception e) {
            log.error("grabarFisicoRegional() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        //cargarListaXMedico();

        return null;
    }

    /**
     * Graba diagnosticos de la atencion asociado al objeto que se administra en
     * la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarDiagnostico() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            if (object.getCcoId() == null) {
                grabarAction(null, false);

            }

            for (CexDiagnosticoConsulta cexDiag : listaDiagnostico) {
                if (cexDiag.getDicId() == null) {
                    cexDiag.setCexConsulta(object);
                }
            }
            hcAdmin.grabarListas(CexDiagnosticoConsulta.class, listaDiagnostico, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
            if (object.getCcoId() != null) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Diagnosticos grabados correctamente", "Diagnosticos grabados correctamente"));
            }
        } catch (Exception e) {
            log.error("grabarDiagnostico() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        //cargarListaXMedico();

        return null;
    }

    /**
     * Graba planes de tratamiento de la atencion asociado al objeto que se
     * administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarPlanTratamiento() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            boolean msgAct = true;
            if (object.getCcoId() == null) {
                grabarAction(null, false);
                msgAct = false;
            }
            for (CexTratamientoConsulta cexDiag : listaProcedimiento) {
                if (cexDiag.getCptId() == null) {
                    cexDiag.setCexConsulta(object);
                }
            }
            hcAdmin.grabarListas(CexTratamientoConsulta.class, listaProcedimiento, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
            if (msgAct) {
                grabarAction(null, false);
            }
            if (object.getCcoId() != null) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Plan de tratamiento grabados correctamente", "Plan de tratamiento grabados correctamente"));
            }
        } catch (Exception e) {
            log.error("grabarPlanTratamiento() {} ", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }

        //cargarListaXMedico();
        return null;
    }

    /**
     * Carga la lista de objetos de tipo patologia en una lista de la página.
     */
    public void cargarSubespecialidades() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            listaDetalle = null;
            return;
        }
        try {
            fecAct.setTime(fecha);
            dia = fecAct.get(Calendar.DAY_OF_WEEK);
            //Inicializa los objetos cada que el medico cambia de subespecialidad
            listaEspecialidadMedico.clear();
            listObjHorarioDia.clear();
            object = new CexConsulta();
            preparacion = new CexPreparacion();
            anteriorConsulta = new CexConsulta();
            List<CexHorario> listHor = new ArrayList<>();
            //verificar si el usuario ingresado es medico
            if (usuario.getAdmMedico() != null) {
                //Verifica si tiene al menos una subespecialidad
                if (!usuario.getAdmMedico().getCexEspecialidadMedicoList().isEmpty() && usuario.getAdmMedico().getCexEspecialidadMedicoList().size() > 0) {
                    //recorre a lista de subespecialidades yse saca los horarios por cada subespecialidad
                    for (CexEspecialidadMedico cexEsp : usuario.getAdmMedico().getCexEspecialidadMedicoList()) {
                        for (CexHorario cexHorarioT : cexEsp.getCexHorarioList()) {
                            listHor.add(cexHorarioT);
                        }
                        ////listHor = cexEsp.getCexHorarioList();
                    }

                    //Rcorre la lista de horarios
                    for (CexHorario cexHorarioTe : listHor) {
                        for (CexHorariosDia cexHorDia : cexHorarioTe.getCexHorariosDiaList()) {
                            if ((cexHorDia.getCexDia().getCdiId().equals(dia)) && (cexHorDia.getCexHorario().getAdmTipoConsulta().equals(admTipoConsulta))) {
                                if (cexHorDia.getChdHoraInicioAm() != null && cexHorDia.getChdHoraFinAm() != null) {
                                    //Se agrega la subespecialidad
                                    listaEspecialidadMedico.add(cexHorDia.getCexHorario().getCexEspecialidadMedico());
                                    //Si es el primer objeto se agrga si validar
                                    listObjHorarioDia.add(cexHorDia);
                                }
                            }
                        }
//////    
                    }

                }
            }
            //cargarListaXMedico();
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Carga la lista de objetos de tipo patologia en una lista de la página.
     */
    public void seleccionarSebMed() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            DateFormat dateFormat = new SimpleDateFormat("hh:mm");
            Calendar c1 = Calendar.getInstance();
            Calendar c2 = Calendar.getInstance();
            Calendar c3 = Calendar.getInstance();
            c1.setTime(admin.getFechaDb());
            int horActual, minutosActual, horInii, horFini, minutoIni, minutoFin;
            horActual = c1.get(Calendar.HOUR_OF_DAY);
            minutosActual = c1.get(Calendar.MINUTE);
            String horaInicio;
            String horaFinT;
            String horaActual2 = horActual + ":" + minutosActual;
            Date horaActual, horaFin, horaIni;
            horaActual = dateFormat.parse(horaActual2); //Esta es la hora que me viene de la BD
            for (CexHorariosDia cexH : listObjHorarioDia) {
                c2.setTime(cexH.getChdHoraInicioAm());
                c3.setTime(cexH.getChdHoraFinAm());
                horInii = c2.get(Calendar.HOUR_OF_DAY);
                minutoIni = c2.get(Calendar.MINUTE);
                horFini = c3.get(Calendar.HOUR_OF_DAY);
                minutoFin = c3.get(Calendar.MINUTE);
                horaInicio = horInii + ":" + minutoIni;
                horaFinT = horFini + ":" + minutoFin;
                horaIni = dateFormat.parse(horaInicio);
                horaFin = dateFormat.parse(horaFinT);
                if (horaActual.compareTo(horaIni) >= 0 && horaActual.compareTo(horaFin) <= 0) {
                    objEspecialidadMedico = cexH.getCexHorario().getCexEspecialidadMedico();
                }
            }
            cargarListaXMedico();
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Carga la lista de objetos de tipo patologia en una lista de la página.
     */
    public void buscarDiagnostico() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        if (admin == null) {
            listadiagnosticoPopup = null;
            return;
        }
        try {
            busquedaDiagnostico = busquedaDiagnostico.toUpperCase();

            if (!busquedaDiagnostico.isEmpty() || busquedaDiagnostico != null) {
                if (tipoBusquedaDiagnostico == 1) {
                    listadiagnosticoPopup = adminObject.listarContiene(CexDiagnostico.class, "cdiCodigo", busquedaDiagnostico);
                } else {
                    listadiagnosticoPopup = adminObject.listarContiene(CexDiagnostico.class, "cdiNombre", busquedaDiagnostico);
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "parDiag").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ingres valor para realizar la busqueda", "Ingres valor para realizar la busqueda"));

            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Agrega el item seleccinado de la tabla de busqueda de diagnostico al
     * objeto actual.
     *
     * @param item
     */
    public void agregarDiagnostico(CexDiagnostico item) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            if (item.getCdiSexo().equals(0) || item.getCdiSexo().equals(preparacion.getCexAgenda().getCexHistoriaClinica().getChcGenero())) {
                diagnostico1.setCexDiagnostico(item);
                diagnostico1.setDicPrevencion(0);
                diagnostico1.setDicMorbilidad(0);
                diagnostico1.setCexCondicionDiagnostico(null);
                isPrevencion = diagnostico1.getCexDiagnostico().getCdiCodigo().substring(0, 1).equals("Z");
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se puede agregar diagnostico", "Codigo incompatible con genero de paciente"));
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Carga la lista de objetos de tipo patologia en una lista de la página.
     */
    public void nuevaBusquedaDiag() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            listadiagnosticoPopup = null;
            return;
        }
        try {
            listadiagnosticoPopup = null;
            busquedaDiagnostico = null;

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Agregar items de fisico en la consulta medica.
     *
     */
    public void agregarProcedimiento() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            if (procedimiento.getCexProcedimiento() != null) {
                procedimiento.setCptObservacion(procedimiento.getCptObservacion().toUpperCase());
                for (CexTratamientoConsulta cexPat : listaProcedimiento) {
                    if (Objects.equals(cexPat.getCexProcedimiento().getCprId(), procedimiento.getCexProcedimiento().getCprId())) {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "procedimientocmb").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Tratamiento ya se encuentra agregada", "Tratamiento ya se encuentra agregada"));
                        return;
                    }
                }

                listaProcedimiento.add(procedimiento);
                procedimiento = new CexTratamientoConsulta();

            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "procedimientocmb").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Tratamiento campo requerido", "Tratamiento campo requerido"));
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e.getMessage());
        }

    }

    /**
     * Seleccuina procedimiento y elimina el procedimiento de la consulta.
     *
     * @param item
     */
    public void eliminarProcedimiento(CexTratamientoConsulta item) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            if (item.getCptId() != null) {
                adminObject.eliminar(item, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                listaProcedimiento.remove(item);
            } else {
                // int indice = listaDiagnostico.indexOf(item);
                List<CexTratamientoConsulta> lisTe = new ArrayList<>();
                for (CexTratamientoConsulta cexCon : listaProcedimiento) {
                    if (!item.getCexProcedimiento().getCprId().equals(cexCon.getCexProcedimiento().getCprId())) {
                        lisTe.add(cexCon);
                    }
                }
                listaProcedimiento.clear();
                listaProcedimiento = lisTe;

            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e.getMessage());
        }

    }

    /**
     * Implementa el comportamiento para seleccionar un elemento en una lista de
     * la página.
     *
     * @param item
     * @return nu
     */
    public String seleccionarActionPreparacion(CexPreparacion item) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        //inicializar();
        try {
            anteriorConsulta = null;
            int res = 0;
            preparacion = (CexPreparacion) adminObject.buscar(CexPreparacion.class, item.getCprId());
            object = (CexConsulta) admin.buscar(CexConsulta.class, "cexPreparacion", preparacion);
            //Lista de organos y sistemas
            listaGeriatricoconsulta.clear();
            if (listaDiagnostico == null) {
                listaDiagnostico = new ArrayList<>();
            } else {
                listaDiagnostico.clear();
            }

            cargarRevisionSistemas();
            cargarAntecedentesPatologicos();
            cargarAntecedentesFamiiliares();
            if (object != null) {
                //cargar atenciones anteriores
                cargarAtencionesAnteriores(item);
                cargarExamenFisico();
                //listaPatologia = object.getCexPreparacion().getCexAgenda().getCexHistoriaClinica().getCexAntecedentesPatologicosList();
                //listaPatologiaF = object.getCexPreparacion().getCexAgenda().getCexHistoriaClinica().getCexAntecedentesFamiliaresList();
                //listaFisico = object.getCexExamenFisicoList();
                //llenar con los diagnosticos de la antigua consulta
                listaDiagnostico = object.getCexDiagnosticoConsultaList();

                //cargar escalas geriatricas desde la abse
                if (object.getCexGeriatricoConsultaList().size() > 1 || !object.getCexGeriatricoConsultaList().isEmpty()) {
                    listaGeriatricoconsulta = object.getCexGeriatricoConsultaList();
                    for (CexSindromeGeriatrico objSin : listaSindromeGeriatrico) {
                        objSin.setTotal(0);
                        for (CexSindromeGeriatrico objTen : objSin.getCexSindromeGeriatricoList()) {
                            for (CexGeriatricoConsulta cexGc : listaGeriatricoconsulta) {
                                if (cexGc.getCexSindromeGeriatrico().equals(objTen)) {
                                    objTen.setValorRespuesta(cexGc.getCgcRespuesta());

                                }
                            }
                            objSin.setTotal(objSin.getTotal() + objTen.getValorRespuesta());
                        }
                    }
                } else {
                    cargarEscalasGeriatricas();
                }

                listaProcedimiento = object.getCexTratamientoConsultaList();
                listaGrupoAtencion = object.getCexGrupoAtencionList();
            } else {
                //cargar atenciones anteriores
                cargarAtencionesAnteriores(item);
                object = new CexConsulta();
                object.setCcoRenova(false);
                object.setCexPreparacion(preparacion);
                cargarExamenFisico();
                //lista.clear();
                //object.setCexExamenFisicoList(new ArrayList<CexExamenFisico>());
                //listaPatologia = object.getCexPreparacion().getCexAgenda().getCexHistoriaClinica().getCexAntecedentesPatologicosList();
                //listaPatologiaF = object.getCexPreparacion().getCexAgenda().getCexHistoriaClinica().getCexAntecedentesFamiliaresList();
                //listaFisico.clear();
                //llenar con los diagnosticos de la antigua consulta
                listaDiagnostico = object.getCexDiagnosticoConsultaList();
                //cargar escalas geriatricas desde la abse
                cargarEscalasGeriatricas();

                listaProcedimiento.clear();
                listaGrupoAtencion.clear();
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e.getMessage());
        }

        return null;
    }

    /**
     * Carga la lista de objetos en una lista de la página de fisico regional.
     *
     * @param obj
     */
    public void cargarAtencionesAnteriores(CexPreparacion obj) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            listaAtencionPopup = null;
            return;
        }
        try {
            listaAtencionPopup = new ArrayList<>();
            for (CexAgenda cexAge : obj.getCexAgenda().getCexHistoriaClinica().getCexAgendaList()) {
                if (cexAge.getCexPreparacionList().size() > 0) {
                    CexPreparacion cexPre = cexAge.getCexPreparacionList().get(0);
                    for (CexConsulta cexCon : cexPre.getCexConsultaList()) {
                        if (cexCon.getCcoEstado() == 1) {
                            listaAtencionPopup.add(cexCon);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    public void cargarListaXMedico() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            listaDetalle = null;
            return;
        }
        List<CexPreparacion> listTempPre;
        try {
            fecAct.setTime(fecha);
            dia = fecAct.get(Calendar.DAY_OF_WEEK);
            listaDetalle.clear();
            for (AdmRol rol : usuario.getAdmRolList()) {
                if (rol.getNombre().equals("SUPER ADMINISTRADOR")) {
                    isAdmin = true;
                    break;

                }
            }
            if (isAdmin) {
                listaDetalle = admin.listarOrdenada(CexPreparacion.class, "cexAgenda.cagFecha", fecha, "cexAgenda.cagEstado", 2, "cexAgenda.cagHora", true);
            } else {
                if (objEspecialidadMedico.getCesAmeId() != null) {
                    for (CexHorario cexHor : objEspecialidadMedico.getCexHorarioList()) {
                        for (CexHorariosDia cexHD : cexHor.getCexHorariosDiaList()) {
                            if (cexHD.getCexDia().getCdiId().equals(dia)) {
                                listTempPre = admin.listarOrdenada(CexPreparacion.class, "cexAgenda.cagFecha", fecha, "cexAgenda.cexHorariosDia", cexHD, "cexAgenda.cagEstado", 2, "cexAgenda.cagHora", true);
                                for (CexPreparacion cexPrep : listTempPre) {
                                    listaDetalle.add(cexPrep);
                                }
                            }
                        }

                    }
                }
            }

////////////////            if (object.getCcoId() != null) {
////////////////                int codId = object.getCcoId();
////////////////                object = null;
////////////////                object = (CexConsulta) admin.buscar(CexConsulta.class, codId);
////////////////            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
        try {
            List<CexEspecialidadMedico> listTemp = new ArrayList<>();
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidadMedico obj : listaEspecialidadMedico) {
                if (!listTemp.contains(obj)) {
                    items.add(new SelectItem(obj, obj.getCexEspecialidad().getCesNombre()));
                    listTemp.add(obj);
                }

            }
            //if (objEspecialidadMedico == null) {
            seleccionarSebMed();
            //}

            return items;
        } catch (Exception e) {
            log.error("getSelectedItem() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Agregar items de las patologias en antecedentes personaes.
     *
     */
    public void agregarDiagnostico() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {

            if (listaDiagnostico == null) {
                listaDiagnostico = new ArrayList<>();
            }
            boolean aux2 = false;
            if (isPrevencion) {
                if (diagnostico1.getDicPrevencion() == 0) {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Prevención campo obligatorio", "Prevención campo obligatorio"));
                    return;
                }
            } else {
                if (diagnostico1.getDicMorbilidad() == 0 || diagnostico1.getCexCondicionDiagnostico() == null) {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Morbilidad y tipo de diagnostico campo obligatorio", "Morbilidad y tipo de diagnostico campo obligatorio"));
                    return;
                }
            }

            if (diagnostico1.getCexDiagnostico() != null) {
                diagnostico1.setDicObservacion(diagnostico1.getDicObservacion().toUpperCase());

                for (CexDiagnosticoConsulta cexPat : listaDiagnostico) {
                    //Validar que solo se agregue un diagnostico primario
                    if (cexPat.getDicTipo() == 1) {
                        aux2 = true;
                    }
                }

                if (aux2 && isDiagPrincipal) {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se puede agregar otro diagnostico primario", "No se puede agregar otro diagnostico primario"));
                    return;
                }
                //Agregar diagnostico
                if (isDiagPrincipal) {
                    diagnostico1.setDicTipo(1);
                } else {
                    diagnostico1.setDicTipo(0);
                }
                listaDiagnostico.add(diagnostico1);
                diagnostico1 = new CexDiagnosticoConsulta();
                diagnostico1.setDicMorbilidad(0);
                diagnostico1.setDicPrevencion(0);
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "diag1").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Diagnostico campo requerido", "Diagnostico campo requerido"));
            }
            isDiagPrincipal = false;
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e.getMessage());
        }

    }

    /**
     * Seleccuina diagnostico y carga para ser editado sus valores.
     *
     * @param item
     */
    public void editarDiagnostico(CexDiagnosticoConsulta item) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            diagnostico1 = item;
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e.getMessage());
        }

    }

    /**
     * Seleccuina diagnostico y elimina diagnostico consulta.
     *
     * @param item
     */
    public void eliminarDiagnostico(CexDiagnosticoConsulta item) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            if (item.getDicId() != null) {
                adminObject.eliminar(item, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                listaDiagnostico.remove(item);
            } else {
                // int indice = listaDiagnostico.indexOf(item);
                List<CexDiagnosticoConsulta> lisTe = new ArrayList<>();
                for (CexDiagnosticoConsulta cexCon : listaDiagnostico) {
                    if (!item.getCexDiagnostico().getCdiId().equals(cexCon.getCexDiagnostico().getCdiId())) {
                        lisTe.add(cexCon);
                    }
                }
                listaDiagnostico.clear();
                listaDiagnostico = lisTe;

            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e.getMessage());
        }

    }

    /**
     * Metodo que carga lista dinamica de revision de Sistemas y organos
     *
     * @author David Carranza
     */
    public void cargarRevisionSistemas() {

        try {
            listaOrganos.clear();
            CexRevisionOrganos cexRev = new CexRevisionOrganos();
            if (object != null) {

                if (object.getCexRevisionOrganosList() != null) {
                    if (object.getCexRevisionOrganosList().size() > 0
                            && !object.getCexRevisionOrganosList().isEmpty()) {
                        if (object.getCexRevisionOrganosList().size() < listaSistemasOrganos.size()) {

                            //traspaso de listya
                            List<CexRevisionOrganos> listatemp = new ArrayList<>();
                            for (CexRevisionOrganos objT : listaOrganos) {
                                listatemp.add(objT);
                            }
                            listaOrganos.clear();
                            //llenado de nuevo la lista
                            for (CexSistemasOrganos objSis : listaSistemasOrganos) {
                                cexRev.setCexSistemasOrganos(objSis);
                                listaOrganos.add(cexRev);
                                cexRev = new CexRevisionOrganos();
                            }

                            boolean act;
                            for (CexRevisionOrganos objSis : listatemp) {
                                act = false;
                                for (int i = 1; i <= listaSistemasOrganos.size(); i++) {
                                    if (listaSistemasOrganos.get(i).equals(objSis.getCexSistemasOrganos())) {
                                        //eliminar objeto temporal
                                        listaOrganos.remove(i);
                                        listaOrganos.add(i, objSis);
                                        act = true;
                                    }
                                    if (act) {
                                        break;
                                    }
                                }
                            }
                        } else {
                            listaOrganos = object.getCexRevisionOrganosList();
                        }

                    } else {
                        for (CexSistemasOrganos objSis : listaSistemasOrganos) {
                            cexRev.setCexSistemasOrganos(objSis);
                            listaOrganos.add(cexRev);
                            cexRev = new CexRevisionOrganos();
                        }
                    }
                } else {
                    for (CexSistemasOrganos objSis : listaSistemasOrganos) {
                        cexRev.setCexSistemasOrganos(objSis);
                        listaOrganos.add(cexRev);
                        cexRev = new CexRevisionOrganos();
                    }
                }
            } else {
                for (CexSistemasOrganos objSis : listaSistemasOrganos) {
                    cexRev.setCexSistemasOrganos(objSis);
                    listaOrganos.add(cexRev);
                    cexRev = new CexRevisionOrganos();
                }
            }

        } catch (Exception e) {
            log.error("{}: {} ", "cargarRevisionSistemas", e);
        }

    }

    /**
     * Metodo que carga lista dinamica de revision de Sistemas y organos
     *
     * @author David Carranza
     */
    public void cargarAntecedentesFamiiliares() {

        try {
            listaPatologiaF.clear();
            List<CexPatologia> listaHiTm = new ArrayList<>();
            CexAntecedentesFamiliares cexAnf = new CexAntecedentesFamiliares();
            //Añade los padres
            for (CexPatologia objT : listaFam) {
                cexAnf.setCexPatologia(objT);
                listaPatologiaF.add(cexAnf);
                cexAnf = new CexAntecedentesFamiliares();
            }
            if (object != null) {
                if (object.getCexAntecedentesFamiliaresList() != null) {

                    if (object.getCexAntecedentesFamiliaresList().size() > 0
                            && !object.getCexAntecedentesFamiliaresList().isEmpty()) {
                        //Añade los hijos
                        for (CexAntecedentesFamiliares objAp : listaPatologiaF) {
                            for (CexPatologia objHj : listaFamHijos) {
                                if (objAp.getListaHijos() == null) {
                                    objAp.setListaHijos(new ArrayList<CexAntecedentesFamiliares>());
                                }
                                if (objHj.getCexPatologia().equals(objAp.getCexPatologia())) {
                                    listaHiTm.add(objHj);
                                }
                            }
                        }
                        if (object.getCexAntecedentesFamiliaresList().size() < listaHiTm.size()) {
                            //traspaso de listya
                            List<CexAntecedentesFamiliares> listatemp = new ArrayList<>();
                            for (CexAntecedentesFamiliares objT : object.getCexAntecedentesFamiliaresList()) {
                                listatemp.add(objT);
                            }

                            //llenado de nuevo la lista
                            List<CexAntecedentesFamiliares> listatmD = new ArrayList<>();
                            for (CexPatologia objSis : listaHiTm) {
                                cexAnf.setCexPatologia(objSis);
                                listatmD.add(cexAnf);
                                cexAnf = new CexAntecedentesFamiliares();
                            }

                            boolean act;
                            for (CexAntecedentesFamiliares objSis : listatemp) {
                                act = false;
                                for (int i = 0; i < listaHiTm.size(); i++) {
                                    if (listaHiTm.get(i).equals(objSis.getCexPatologia())) {
                                        //eliminar objeto temporal
                                        listatmD.remove(i);
                                        listatmD.add(i, objSis);
                                        act = true;
                                    }
                                    if (act) {
                                        break;
                                    }
                                }
                            }

                            for (CexAntecedentesFamiliares objAp : listaPatologiaF) {
                                for (CexAntecedentesFamiliares objHj : listatmD) {
                                    if (objAp.getListaHijos() == null) {
                                        objAp.setListaHijos(new ArrayList<CexAntecedentesFamiliares>());
                                    }
                                    if (objHj.getCexPatologia().getCexPatologia().equals(objAp.getCexPatologia())) {
                                        objAp.getListaHijos().add(objHj);

                                    }
                                }
                            }
                        } else {
                            for (CexAntecedentesFamiliares objAp : listaPatologiaF) {
                                for (CexAntecedentesFamiliares objHj : object.getCexAntecedentesFamiliaresList()) {
                                    if (objAp.getListaHijos() == null) {
                                        objAp.setListaHijos(new ArrayList<CexAntecedentesFamiliares>());
                                    }
                                    if (objHj.getCexPatologia().getCexPatologia().equals(objAp.getCexPatologia())) {
                                        objAp.getListaHijos().add(objHj);

                                    }
                                }
                            }
                        }

                    } else {
                        for (CexAntecedentesFamiliares objAp : listaPatologiaF) {
                            for (CexPatologia objHj : listaFamHijos) {
                                if (objAp.getListaHijos() == null) {
                                    objAp.setListaHijos(new ArrayList<CexAntecedentesFamiliares>());
                                }
                                if (objHj.getCexPatologia().equals(objAp.getCexPatologia())) {
                                    cexAnf.setCexPatologia(objHj);
                                    objAp.getListaHijos().add(cexAnf);
                                    cexAnf = new CexAntecedentesFamiliares();
                                }
                            }
                        }
                    }
                } else {
                    for (CexAntecedentesFamiliares objAp : listaPatologiaF) {
                        for (CexPatologia objHj : listaFamHijos) {
                            if (objAp.getListaHijos() == null) {
                                objAp.setListaHijos(new ArrayList<CexAntecedentesFamiliares>());
                            }
                            if (objHj.getCexPatologia().equals(objAp.getCexPatologia())) {
                                cexAnf.setCexPatologia(objHj);
                                objAp.getListaHijos().add(cexAnf);
                                cexAnf = new CexAntecedentesFamiliares();
                            }
                        }
                    }
                }
            } else {
                for (CexAntecedentesFamiliares objAp : listaPatologiaF) {
                    for (CexPatologia objHj : listaFamHijos) {
                        if (objAp.getListaHijos() == null) {
                            objAp.setListaHijos(new ArrayList<CexAntecedentesFamiliares>());
                        }
                        if (objHj.getCexPatologia().equals(objAp.getCexPatologia())) {
                            cexAnf.setCexPatologia(objHj);
                            objAp.getListaHijos().add(cexAnf);
                            cexAnf = new CexAntecedentesFamiliares();
                        }
                    }
                }
            }

        } catch (Exception e) {
            log.error("{}: {} ", "cargarAntecedentesFamiiliares", e);
        }

    }

    /**
     * Metodo que carga lista dinamica de revision de Antecedentes patologiccos
     *
     * @author David Carranza
     */
    public void cargarAntecedentesPatologicos() {

        try {
            listaPatologia.clear();
            List<CexPatologia> listaHiTm = new ArrayList<>();
            CexAntecedentesPatologicos cexAnt = new CexAntecedentesPatologicos();
            //Añade los padres
            for (CexPatologia objT : listaPatPadres) {
                cexAnt.setCexPatologia(objT);
                listaPatologia.add(cexAnt);
                cexAnt = new CexAntecedentesPatologicos();
            }
            if (object != null) {
                if (object.getCexAntecedentesPatologicosList() != null) {

                    if (object.getCexAntecedentesPatologicosList().size() > 0
                            && !object.getCexAntecedentesPatologicosList().isEmpty()) {
                        //Añade los hijos
                        for (CexAntecedentesPatologicos objAp : listaPatologia) {
                            for (CexPatologia objHj : listaPatHijos) {
                                if (objAp.getListaHijos() == null) {
                                    objAp.setListaHijos(new ArrayList<CexAntecedentesPatologicos>());
                                }
                                if (objHj.getCexPatologia().equals(objAp.getCexPatologia())) {
                                    listaHiTm.add(objHj);
                                }
                            }
                        }
                        if (object.getCexAntecedentesPatologicosList().size() < listaHiTm.size()) {
                            //traspaso de listya
                            List<CexAntecedentesPatologicos> listatemp = new ArrayList<>();
                            for (CexAntecedentesPatologicos objT : object.getCexAntecedentesPatologicosList()) {
                                listatemp.add(objT);
                            }

                            //llenado de nuevo la lista
                            List<CexAntecedentesPatologicos> listatmD = new ArrayList<>();
                            for (CexPatologia objSis : listaHiTm) {
                                cexAnt.setCexPatologia(objSis);
                                listatmD.add(cexAnt);
                                cexAnt = new CexAntecedentesPatologicos();
                            }

                            boolean act;
                            for (CexAntecedentesPatologicos objSis : listatemp) {
                                act = false;
                                for (int i = 0; i < listaHiTm.size(); i++) {
                                    if (listaHiTm.get(i).equals(objSis.getCexPatologia())) {
                                        //eliminar objeto temporal
                                        listatmD.remove(i);
                                        listatmD.add(i, objSis);
                                        act = true;
                                    }
                                    if (act) {
                                        break;
                                    }
                                }
                            }

                            for (CexAntecedentesPatologicos objAp : listaPatologia) {
                                for (CexAntecedentesPatologicos objHj : listatmD) {
                                    if (objAp.getListaHijos() == null) {
                                        objAp.setListaHijos(new ArrayList<CexAntecedentesPatologicos>());
                                    }
                                    if (objHj.getCexPatologia().getCexPatologia().equals(objAp.getCexPatologia())) {
                                        objAp.getListaHijos().add(objHj);

                                    }
                                }
                            }
                        } else {
                            for (CexAntecedentesPatologicos objAp : listaPatologia) {
                                for (CexAntecedentesPatologicos objHj : object.getCexAntecedentesPatologicosList()) {
                                    if (objAp.getListaHijos() == null) {
                                        objAp.setListaHijos(new ArrayList<CexAntecedentesPatologicos>());
                                    }
                                    if (objHj.getCexPatologia().getCexPatologia().equals(objAp.getCexPatologia())) {
                                        objAp.getListaHijos().add(objHj);

                                    }
                                }
                            }
                        }

                    } else {

                        //Añade los hijos
                        for (CexAntecedentesPatologicos objAp : listaPatologia) {
                            for (CexPatologia objHj : listaPatHijos) {
                                if (objAp.getListaHijos() == null) {
                                    objAp.setListaHijos(new ArrayList<CexAntecedentesPatologicos>());
                                }
                                if (objHj.getCexPatologia().equals(objAp.getCexPatologia())) {
                                    cexAnt.setCexPatologia(objHj);
                                    objAp.getListaHijos().add(cexAnt);
                                    cexAnt = new CexAntecedentesPatologicos();
                                }
                            }
                        }
                    }
                } else {
                    for (CexAntecedentesPatologicos objAp : listaPatologia) {
                        for (CexPatologia objHj : listaPatHijos) {
                            if (objAp.getListaHijos() == null) {
                                objAp.setListaHijos(new ArrayList<CexAntecedentesPatologicos>());
                            }
                            if (objHj.getCexPatologia().equals(objAp.getCexPatologia())) {
                                cexAnt.setCexPatologia(objHj);
                                objAp.getListaHijos().add(cexAnt);
                                cexAnt = new CexAntecedentesPatologicos();
                            }
                        }
                    }
                }
            } else {
                for (CexAntecedentesPatologicos objAp : listaPatologia) {
                    for (CexPatologia objHj : listaPatHijos) {
                        if (objAp.getListaHijos() == null) {
                            objAp.setListaHijos(new ArrayList<CexAntecedentesPatologicos>());
                        }
                        if (objHj.getCexPatologia().equals(objAp.getCexPatologia())) {
                            cexAnt.setCexPatologia(objHj);
                            objAp.getListaHijos().add(cexAnt);
                            cexAnt = new CexAntecedentesPatologicos();
                        }
                    }
                }
            }

        } catch (Exception e) {
            log.error("{}: {} ", "cargarAntecedentesPatologicos", e);
        }

    }

    /**
     * Metodo que carga lista dinamica de revision de Antecedentes patologiccos
     *
     * @author David Carranza
     */
    public void cargarExamenFisico() {

        try {
            listaFisico.clear();
            List<CexFisicoRegional> listaHiTm = new ArrayList<>();
            CexExamenFisico cexFis = new CexExamenFisico();
            //Añade los padres
            for (CexFisicoRegional objT : listaFisPadres) {
                cexFis.setCexFisicoRegional(objT);
                listaFisico.add(cexFis);
                cexFis = new CexExamenFisico();
            }
            if (object.getCexExamenFisicoList() != null) {
                if (object.getCexExamenFisicoList().size() > 0
                        && !object.getCexExamenFisicoList().isEmpty()) {
                    //Añade los hijos
                    for (CexExamenFisico objAp : listaFisico) {
                        for (CexFisicoRegional objHj : listaFisHijos) {
                            if (objAp.getListaHijos() == null) {
                                objAp.setListaHijos(new ArrayList<CexExamenFisico>());
                            }
                            if (objHj.getCexFisicoRegional().equals(objAp.getCexFisicoRegional())) {
                                listaHiTm.add(objHj);
                            }
                        }
                    }
                    if (object.getCexExamenFisicoList().size() < listaHiTm.size()) {
                        //traspaso de listya
                        List<CexExamenFisico> listatemp = new ArrayList<>();
                        for (CexExamenFisico objT : object.getCexExamenFisicoList()) {
                            listatemp.add(objT);
                        }

                        //llenado de nuevo la lista
                        List<CexExamenFisico> listatmD = new ArrayList<>();
                        for (CexFisicoRegional objSis : listaHiTm) {
                            cexFis.setCexFisicoRegional(objSis);
                            listatmD.add(cexFis);
                            cexFis = new CexExamenFisico();
                        }

                        boolean act;
                        for (CexExamenFisico objSis : listatemp) {
                            act = false;
                            for (int i = 0; i < listaHiTm.size(); i++) {
                                if (listaHiTm.get(i).equals(objSis.getCexFisicoRegional())) {
                                    //eliminar objeto temporal
                                    listatmD.remove(i);
                                    listatmD.add(i, objSis);
                                    act = true;
                                }
                                if (act) {
                                    break;
                                }
                            }
                        }

                        for (CexExamenFisico objAp : listaFisico) {
                            for (CexExamenFisico objHj : listatmD) {
                                if (objAp.getListaHijos() == null) {
                                    objAp.setListaHijos(new ArrayList<CexExamenFisico>());
                                }
                                if (objHj.getCexFisicoRegional().getCexFisicoRegional().equals(objAp.getCexFisicoRegional())) {
                                    objAp.getListaHijos().add(objHj);

                                }
                            }
                        }
                    } else {
                        for (CexExamenFisico objAp : listaFisico) {
                            for (CexExamenFisico objHj : object.getCexExamenFisicoList()) {
                                if (objAp.getListaHijos() == null) {
                                    objAp.setListaHijos(new ArrayList<CexExamenFisico>());
                                }
                                if (objHj.getCexFisicoRegional().getCexFisicoRegional().equals(objAp.getCexFisicoRegional())) {
                                    objAp.getListaHijos().add(objHj);

                                }
                            }
                        }
                    }

                } else {

                    //Añade los hijos
                    for (CexExamenFisico objAp : listaFisico) {
                        for (CexFisicoRegional objHj : listaFisHijos) {
                            if (objAp.getListaHijos() == null) {
                                objAp.setListaHijos(new ArrayList<CexExamenFisico>());
                            }
                            if (objHj.getCexFisicoRegional().equals(objAp.getCexFisicoRegional())) {
                                cexFis.setCexFisicoRegional(objHj);
                                objAp.getListaHijos().add(cexFis);
                                cexFis = new CexExamenFisico();
                            }
                        }
                    }
                }
            } else {

                //Añade los hijos
                for (CexExamenFisico objAp : listaFisico) {
                    for (CexFisicoRegional objHj : listaFisHijos) {
                        if (objAp.getListaHijos() == null) {
                            objAp.setListaHijos(new ArrayList<CexExamenFisico>());
                        }
                        if (objHj.getCexFisicoRegional().equals(objAp.getCexFisicoRegional())) {
                            cexFis.setCexFisicoRegional(objHj);
                            objAp.getListaHijos().add(cexFis);
                            cexFis = new CexExamenFisico();
                        }
                    }
                }
            }

        } catch (Exception e) {
            log.error("{}: {} ", "cargarExamenFisico", e);
        }

    }

    /**
     * Funcion que divide dos numero BigDecimales en el caso de que el resultado
     * sea mas extenso de lo que este puede abarcar en la expecion lo divide
     * como double
     *
     * @param A
     * @param B
     * @return BigDecimal,
     */
    public static BigDecimal divisionControlada(BigDecimal A, BigDecimal B) {
        try {
            return A.divide(B);
        } catch (Exception e) {
            return new BigDecimal(A.doubleValue() / B.doubleValue());
        }
    }

    /**
     * Carga la lista de detalles de escaleas geriatricas.
     *
     * @param item
     */
    public void cargarDetalleGeriatricas(CexSindromeGeriatrico item) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            sindromeGer = item;
            sindromeGer.setTotal(0);
            for (CexSindromeGeriatrico objSin : sindromeGer.getCexSindromeGeriatricoList()) {
                for (CexGeriatricoConsulta objGer : listaGeriatricoconsulta) {
                    if (objSin.equals(objGer.getCexSindromeGeriatrico())) {
                        if (objGer.getCgcRespuesta() == null) {
                            objGer.setCgcRespuesta(0);
                        }
                        objSin.setValorRespuesta(objGer.getCgcRespuesta());
                        sindromeGer.setTotal(sindromeGer.getTotal() + objGer.getCgcRespuesta());
                    }
                }
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Graba escalas geriatricas de la atencion asociado al objeto que se
     * administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarEscalasGeriatricas() {
        FacesContext context = FacesContext.getCurrentInstance();
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            int res = 0;
            if (object.getCcoId() == null) {
                grabarAction(null, false);
            }
            for (CexGeriatricoConsulta objTem : listaGeriatricoconsulta) {
                if (objTem.getCgcId() == null) {
                    objTem.setCexConsulta(object);
                }
                if (objTem.getCgcRespuesta() == null) {
                    objTem.setCgcRespuesta(0);
                }
                res = res + objTem.getCgcRespuesta();

            }
            if (res > 0) {
                hcAdmin.grabarListas(CexGeriatricoConsulta.class, listaGeriatricoconsulta, user);
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Escalas geriatricas no se grabaron", "No ha modificado ninguna escala"));
            }

            if (object.getCcoId() != null) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Escalas geriatricas grabadas correctamente", "Escalas geriatricas grabadas correctamente"));
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        return null;
    }

    /**
     * Agrega el detalle de la escala geriatrica.
     *
     */
    public void agregarDetalleGeriatricas() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            boolean act = false;
            for (CexGeriatricoConsulta cexgerCon : listaGeriatricoconsulta) {
                for (CexSindromeGeriatrico cexObjSin : sindromeGer.getCexSindromeGeriatricoList()) {
                    if (cexObjSin.equals(cexgerCon.getCexSindromeGeriatrico())) {
                        cexgerCon.setCgcRespuesta(cexObjSin.getValorRespuesta());
                    }
                }

                for (CexSindromeGeriatrico cexObjLisSin : listaSindromeGeriatrico) {
                    if (cexObjLisSin.equals(cexgerCon.getCexSindromeGeriatrico())) {
                        cexObjLisSin.setValorRespuesta(cexgerCon.getCgcRespuesta());
                    }
                }
                act = true;
            }
            if (act) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Se agrego correctamente", "Cierre ventana emergente"));
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Carga la lista de escala geriatricas para la puntuacion adecuada.
     *
     */
    public void cargarEscalasGeriatricas() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            listaGeriatricoconsulta = null;
            return;
        }
        try {
            CexGeriatricoConsulta cexGeriatricoCons = new CexGeriatricoConsulta();
            for (CexSindromeGeriatrico cexSindromeGeriatrico : listaSindromeGeriatrico) {
                cexSindromeGeriatrico.setTotal(0);
                for (CexSindromeGeriatrico objCes : cexSindromeGeriatrico.getCexSindromeGeriatricoList()) {
                    objCes.setValorRespuesta(0);
                    cexGeriatricoCons.setCexSindromeGeriatrico(objCes);
                    listaGeriatricoconsulta.add(cexGeriatricoCons);
                    cexGeriatricoCons = new CexGeriatricoConsulta();
                }
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Calcula el total del detalle de las escalas geriatricas.
     *
     */
    public void totalDetalleGeriatricas() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            sindromeGer.setTotal(0);
            for (CexSindromeGeriatrico cexDetObj : sindromeGer.getCexSindromeGeriatricoList()) {
                if (cexDetObj.getValorRespuesta() != null) {
                    sindromeGer.setTotal(sindromeGer.getTotal() + cexDetObj.getValorRespuesta());
                }
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Iyección de dependencia para conectarse al EJB(Lógica de Negocio)
     * Iyección de dependencia para el sistema de Administarción. Iyección de
     * dependencia para el sistema de Emergencia.
     */
    @Override
    protected void cargarEjb() {
        //super.cargarEjb();
        if (hcAdmin == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.ConsExterna");
                ejbPath = ORBContext + ejbContextPath + "/ConsExternaAdministradorBean";
                hcAdmin = (ConsExternaAdministrador) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error("cargarEjb() {} - {} ", ejbPath, e.getMessage());
            }

        }
        if (admin == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorBeanHaiam";
                admin = (AdministradorHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error(" cargarEjb() {} - {} ", ejbPath, e.getMessage());
            }
        }
        if (adminObject == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorBeanHaiam";
                adminObject = (AdministradorHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error(" cargarEjb() {} - {} ", ejbPath, e.getMessage());
            }
        }
    }

    public String cargarAtencionAnterior(CexConsulta obj) {
        //inicializar();
        try {
            anteriorConsulta = null;
            anteriorConsulta = obj;
        } catch (Exception e) {
            log.error("{}: {} ", "cargarPaciente", e);
        }
        return null;
    }

    /**
     * Carga la escala geriatrica de acuerdo a la consulta seleccionada.
     *
     * @param obj
     */
    public void cargarEscalaGeriatrica(CexConsulta obj) {
        //inicializar();
        try {
            for (CexSindromeGeriatrico objSin : listaGeriatricoHistorial) {
                objSin.setTotal(0);
                for (CexSindromeGeriatrico objTen : objSin.getCexSindromeGeriatricoList()) {
                    for (CexGeriatricoConsulta cexGc : obj.getCexGeriatricoConsultaList()) {
                        if (cexGc.getCexSindromeGeriatrico().equals(objTen)) {
                            objTen.setValorRespuesta(cexGc.getCgcRespuesta());

                        }
                    }
                    objSin.setTotal(objSin.getTotal() + objTen.getValorRespuesta());
                }
            }
        } catch (Exception e) {
            log.error("{}: {} ", "cargarEscalaGeriatrica", e);
        }

    }

    /**
     * Metodo que busca segun la especialidad , el Doctor el turno vacio mas
     * proximo
     *
     */
    public void buscarSiguienteTurno() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            crearDetallefechaSumada();
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }

    }

    /**
     * Metodo crea agenda y detalkle en las fechas sumadas
     *
     */
    public void crearDetallefechaSumada() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        //Lazo principal mientras el contador sea 0
        try {
            int cont = 0;
            int contTurnos;
            boolean isContLibre = false;
            Date fechaTemporal = fechaCita;
            Date fechaSumada = fechaTemporal;
            boolean isSelected = false;
            int nuevaSecuencia;
            Calendar horaSumada = new GregorianCalendar();
            Calendar cal = new GregorianCalendar();
            int cont1;
            listaHorarioDia.clear();
            listaAgenda.clear();
            while (cont == 0) {
                listaAgenda.clear();
                listaHorarioDia.clear();
                //sumar un dia a la fecha actual hasta que encuentre dia disponible
                cal.setTime(fechaSumada);
                cal.add(Calendar.DATE, 1);
                fechaSumada = cal.getTime();
                Integer diatEMP = cal.get(Calendar.DAY_OF_WEEK);
                fechaCita = cal.getTime();

                //Recupera permiso para saber si se puede agendar en la fecha seleccionada
                List<AdmPermiso> objLicencia = (List<AdmPermiso>) adminObject.queryEJB("select p from AdmPermiso p where :var1 between p.apeFechaInicio and p.apeFechaFin and p.admMedico = :var2", fechaCita, objEspecialidadMedico.getAdmMedico());
                if (objLicencia.size() > 0 || !objLicencia.isEmpty()) {
                    continue;
                }

                //Caso importante si existe la agenda creada 
                //Recuper la lista del horario de acuerdo al dia seleciconado
                for (CexHorario objTemH : objEspecialidadMedico.getCexHorarioList()) {
                    //Agregar horario de acuerdo a la fecha
                    if ((fechaCita.after(objTemH.getChoFechaInicio()) || objTemH.getChoFechaInicio().equals(fechaCita))
                            && (fechaCita.before(objTemH.getChoFechaFin()) || objTemH.getChoFechaFin().equals(fechaCita))) {

                        //Verificar los horarios segun el tipo de consulta de la agenda
                        if (objTemH.getAdmTipoConsulta().equals(admTipoConsulta)) {
                            //Recorrer los horarios dias de cada horario
                            for (CexHorariosDia objTemHd : objTemH.getCexHorariosDiaList()) {
                                if (objTemHd.getCexDia().getCdiId().equals(diatEMP)) {
                                    //Añadir solo el horario que tenga asignado hora inicio y hora fin
                                    if (objTemHd.getChdHoraInicioAm() != null && objTemHd.getChdHoraFinAm() != null) {
                                        listaHorarioDia.add(objTemHd);
                                    }
                                }
                            }
                        }
                    }
                }

                //Veriica que existe horarios asignados de acuerdo al dia de la fecha sumada
                if (listaHorarioDia.isEmpty() || listaHorarioDia.size() <= 0) {
                    continue;
                }

                //Hace un select a la base de datos para obtener la agenda del dia seleccionado
                listarturnos(fechaSumada, 0);

                //verifica si la agenda esta o no crea en el dia seleccioando
                if (listaAgenda.isEmpty() || listaAgenda.size() <= 0) {
                    cont1 = 1;
                    for (CexHorariosDia horDia : listaHorarioDia) {
                        if (horDia.getOrdenHorario() > 0) {
                            cont1 = cont1 + listaHorarioDia.get(horDia.getOrdenHorario() - 1).getChdNumConsultas();
                        }
                        crearDetalle(fechaSumada, horDia, cont1);
                    }
                    isSelected = true;
                    isContLibre = true;
                } else {
                    // Comprobar si el numero de turnos es mayor o igual al numero asignado en los horarios del medico
                    // esto mas en el caso de los turnos migrados
                    for (CexHorariosDia objHorDi : listaHorarioDia) {
                        nuevaSecuencia = 0;
                        contTurnos = 0;
                        //isContLibre = false;
                        for (CexAgenda cexAgetemp1 : listaAgenda) {

                            //Recorrer segun el numero de horarioDia
                            if (objHorDi.getOrdenHorario() == cexAgetemp1.getNumeroHorario()) {
                                if (cexAgetemp1.getCagTipo() == 0 || cexAgetemp1.getCagTipo() == 1 || cexAgetemp1.getCagTipo() == 3) {
                                    nuevaSecuencia++;
                                    contTurnos++;
                                }

                                if (cexAgetemp1.getCagEstado() == 0 && cexAgetemp1.getCagTipo() == 1) {
                                    isContLibre = true;
                                }
                            }

                        }

                        //Verificar Numero de turnos para agregar o quitar turnos
                        if (objHorDi.getChdNumConsultas() > contTurnos) {
                            //Se crea los turnos restantes 
                            int turnosRest = objHorDi.getChdNumConsultas() - contTurnos;
                            //Calcular la Hora
                            //Calcular los tiempos para cada turno
                            horaInicioAm.setTime(objHorDi.getChdHoraInicioAm());
                            horaFinAm.setTime(objHorDi.getChdHoraFinAm());
                            long iniAm = horaInicioAm.getTimeInMillis();
                            long finAm = horaFinAm.getTimeInMillis();
                            //calcular total de minitos al dia asignado al medico
                            long totHoras = (finAm - iniAm);

                            // calcular la diferencia en milisengundos
                            //long diff = milis2 - milis1;
                            // calcular la diferencia en segundos
                            //long diffSeconds = diff / 1000;
                            // calcular la diferencia en minutos
                            diffMinutes = totHoras / (60 * 1000);

                            // calcular la diferencia en horas
                            //long diffHours = diff / (60 * 60 * 1000);
                            // calcular la diferencia en dias
                            //long diffDays = diff / (24 * 60 * 60 * 1000);
                            rangoMuinutos = divisionControlada(new BigDecimal(diffMinutes), new BigDecimal(objHorDi.getChdNumConsultas()));
                            rangoMuinutos = rangoMuinutos.setScale(0, RoundingMode.HALF_UP);
                            //Asignar hora ultima
                            horaSumada.setTime(objHorDi.getCexAgendaList().get(objHorDi.getCexAgendaList().size() - 1).getCagHora());

                            for (int i = 1; i <= turnosRest; i++) {
                                agenda.setCagTipo(1);
                                agenda.setCagSecuencia(nuevaSecuencia + 1);
                                agenda.setCexHorariosDia(objHorDi);
                                agenda.setCagEstado(0);
                                agenda.setCexHistoriaClinica(null);
                                agenda.setCagFecha(fechaCita);
                                horaSumada.add(Calendar.MINUTE, rangoMuinutos.intValue());
                                agenda.setCagHora(horaSumada.getTime());
                                adminObject.crear(agenda, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                agenda = new CexAgenda();
                                isSelected = true;
                                nuevaSecuencia++;
                                //sacar la lista de detalle
                            }
                        } else {
                            //caso contrario elimina los turnos que estan demas en el nuevo horario
                            if (objHorDi.getChdNumConsultas() < contTurnos) {
                                // Se crea los turnos restantes que no esten asignados turnos
                                //los que esten quedan visibles para reasignar
                                int cont2 = 0;
                                int turnosEliminar = contTurnos - objHorDi.getChdNumConsultas();
                                for (CexAgenda cexAgendaTemp : listaAgenda) {
                                    if (cexAgendaTemp.getNumeroHorario() == objHorDi.getOrdenHorario()) {
                                        if (cont2 != turnosEliminar) {
                                            if (cexAgendaTemp.getCexHistoriaClinica() == null) {
                                                adminObject.eliminar(cexAgendaTemp, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                                cont2++;
                                                isSelected = true;
                                            }
                                        }
                                    }

                                }
                            }
                        }
                    }
                }

                if (isContLibre) {
                    cont = 1;
                }

            }

            if (isSelected) {
                //Limpia la lista originay y carga los nuevos valores 
                //Recuperar las agendas de acuerdo al horarioDia y de acuerdo a las fechas
                listarturnos(fechaSumada, 0);
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Metodo que lista los turnos de la tarde si esta activo caso contrario
     * lista todos olos turnos
     *
     * @author David bjTemHor
     * @param fechaTemp
     * @param cont
     */
    public void listarturnos(Date fechaTemp, int cont) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            List<CexAgenda> listTempAgen;
            listaAgenda.clear();
            for (CexHorariosDia objHorDia : listaHorarioDia) {
                //Asignar numero de horario
                objHorDia.setOrdenHorario(cont);
                listTempAgen = adminObject.listarOrdenada(CexAgenda.class, "cagFecha", fechaTemp, "cexHorariosDia", objHorDia, "cagSecuencia", true);
                for (CexAgenda objA : listTempAgen) {
                    objA.setNumeroHorario(cont);
                    listaAgenda.add(objA);
                }
                listTempAgen.clear();
                cont++;
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Metodo generico que crea un agenda de la agenda selecionada
     *
     * @param fechaSumada
     * @param obj
     * @author David Carranza
     * @param contadorTurnos
     * @return
     */
    public List<CexAgenda> crearDetalle(Date fechaSumada, CexHorariosDia obj, int contadorTurnos) {
        List<CexAgenda> lisTem = new ArrayList<>();
        try {
            Integer porcentajeAgenda;
            BigDecimal numConsultas;
            BigDecimal num1;
            BigDecimal totTurnosAutAgenda;
            BigDecimal porAgendaRed;
            BigDecimal total;
            boolean act = false;
            int conArea = 1;

            Calendar horaSumada = new GregorianCalendar();
            int contPorcentaje = 1;
            porcentajeAgenda = obj.getCexHorario().getChoPorcentajeAgenda();

            //Calcular la Hora
            //Calcular los tiempos para cada turno
            horaInicioAm.setTime(obj.getChdHoraInicioAm());
            horaFinAm.setTime(obj.getChdHoraFinAm());
            long iniAm = horaInicioAm.getTimeInMillis();
            long finAm = horaFinAm.getTimeInMillis();
            //calcular total de minitos al dia asignado al medico
            long totHoras = (finAm - iniAm);

            // calcular la diferencia en milisengundos
            //long diff = milis2 - milis1;
            // calcular la diferencia en segundos
            //long diffSeconds = diff / 1000;
            // calcular la diferencia en minutos
            diffMinutes = totHoras / (60 * 1000);

            // calcular la diferencia en horas
            //long diffHours = diff / (60 * 60 * 1000);
            // calcular la diferencia en dias
            //long diffDays = diff / (24 * 60 * 60 * 1000);
            rangoMuinutos = divisionControlada(new BigDecimal(diffMinutes), divisionControlada(new BigDecimal(obj.getChdNumConsultas()), new BigDecimal(obj.getChdIntervalo())));
            rangoMuinutos = rangoMuinutos.setScale(0, RoundingMode.HALF_UP);

            //Recorrer los horarios dias para crear
            //Crear turnos de acuerdo al porcentaje de aggenda para el medico
            numConsultas = new BigDecimal(obj.getChdNumConsultas());
            num1 = (numConsultas.multiply(new BigDecimal(porcentajeAgenda)));
            totTurnosAutAgenda = divisionControlada(num1, new BigDecimal(100));
            porAgendaRed = totTurnosAutAgenda.setScale(0, RoundingMode.HALF_UP);
            total = numConsultas.subtract(porAgendaRed);

            for (int i = 1; i <= obj.getChdNumConsultas(); i++) {
                //Definir el tipo que es para identificar el porcentaje que maneja el medico para asignar turnos
                if (i <= total.intValue()) {
                    if (!act && numConsultas.intValue() > 1) {
                        if (total.intValue() > 2 && i == (total.intValue() - 1)) {
                            agenda.setCagTipo(3);
                            act = true;
                        } else {
                            if (total.intValue() < 3 && conArea == 2) {
                                agenda.setCagTipo(3);
                                act = true;
                            } else {
                                agenda.setCagTipo(0);
                            }
                            conArea++;
                        }
                    } else {
                        agenda.setCagTipo(0);
                    }
                } else {
                    agenda.setCagTipo(1);
                }
                agenda.setCagSecuencia(contadorTurnos);
                agenda.setCexHorariosDia(obj);
                agenda.setCagEstado(0);
                agenda.setCexHistoriaClinica(null);
                agenda.setCagFecha(fechaSumada);
                if (obj.getChdIntervalo() == 1) {
                    if (i == 1) {
                        agenda.setCagHora(horaInicioAm.getTime());
                        horaSumada = horaInicioAm;
                    } else {
                        horaSumada.add(Calendar.MINUTE, rangoMuinutos.intValue());
                        agenda.setCagHora(horaSumada.getTime());
                    }
                } else {
                    if (contPorcentaje <= obj.getChdIntervalo()) {
                        if (i == 1) {
                            agenda.setCagHora(horaInicioAm.getTime());
                            horaSumada = horaInicioAm;
                        } else {
                            agenda.setCagHora(horaSumada.getTime());
                        }

                    } else {
                        horaSumada.add(Calendar.MINUTE, rangoMuinutos.intValue());
                        agenda.setCagHora(horaSumada.getTime());
                        contPorcentaje = 1;

                    }
                    contPorcentaje++;
                }

                adminObject.crear(agenda, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                agenda = new CexAgenda();
                contadorTurnos = contadorTurnos + 1;
                // sacar la lista de detalle
                //turnosLibres = listaHorarioDia.size();
            }

            //int totTurnosAut = numConsultas.intValue() - porAgendaRed.intValue();
            // listaHorarioDia = adminObject.listarOrdenada(CexAgenda.class, "cexHorariosDia", object, "ageFecha", fechaAgenda, "ageTipo", 1, "ageSecuencia", false);
        } catch (Exception e) {
            log.error("{}: {} ", "crearDetalle", e);
        }
        return lisTem;
    }

    /**
     * Implementa el comportamiento para inicializar los datos del objeto a
     * administrar.
     *
     * @return null, retorna a la página invocada.
     */
    public String limpiarMedico() {
        //detalle.setCexMedico(new CexMedico());
        //especialidad = new CexEspecialidad();
        //subEspecialidad = new CexEspecialidad();
        listaAgenda = new ArrayList<>();
        return null;
    }

    /**
     * Asigna un turno para la cita subsecuente
     *
     * @return null, se mantiene en la página invocada.
     */
    public String asignarTurno() {

        FacesContext context = FacesContext.getCurrentInstance();
        try {
            int selectMult = 0;
            boolean isTurnoLibre = false;

            try {

                //Verificar si existen turnos libre o si estan seleccionados mas de 1 turnos
                for (CexAgenda objAgenda : listaAgenda) {
                    if (objAgenda.isSeleccionado()) {
                        selectMult = selectMult + 1;
                    }
                    if (objAgenda.getCagEstado() == 0 && objAgenda.getCagTipo() == 1) {
                        isTurnoLibre = true;
                    }
                }

                if (selectMult > 1) {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Se ha seleccionado mas de un turno", "Solo es permitido seleccionar un turno para agendar"));
                    return null;
                } else if (selectMult == 0) {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No ha seleccionado turno", "Seleccionar al menos un turno para agendar"));
                    return null;
                }

                if (!isTurnoLibre) {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Agenda no disponible", "No dispone de turnos libres para esta agenda"));
                    return null;
                }
                //Recorre la agenda del HorarioDia seleccionado
                for (CexAgenda cexAgenda : listaAgenda) {
                    //Selecciona el objeto con estado para asignarle turbno
                    ///cexHDia.getCexAgendaList()
                    if (cexAgenda.isSeleccionado()) {
                        if (cexAgenda.getCagEstado() == 0 && cexAgenda.getCagTipo() == 1) {
                            //Validar que el mismo paciente no tenga un mismo turno con el mismo paciente
                            if (!admin.existePorCampo(CexAgenda.class, "cexHorariosDia", cexAgenda.getCexHorariosDia(), "cexHistoriaClinica", object.getCexPreparacion().getCexAgenda().getCexHistoriaClinica(), "cagFecha", fechaCita)) {
                                //Asignar al objeto temporal el objeto de la lista seleccionado
                                CexAgenda objAgenda = (CexAgenda) adminObject.buscar(CexAgenda.class, cexAgenda.getCagId());
                                objAgenda.setCexHistoriaClinica(object.getCexPreparacion().getCexAgenda().getCexHistoriaClinica());
                                objAgenda.setCagEstado(1);
                                objAgenda.setCagFechaRegistro(admin.getFechaDb());
                                objAgenda.setCagHoraRegistro(admin.getFechaDb());
                                //hcAgenda.setAgeTipo(1);
                                objAgenda.setCagIdUsuario(user.getUser().getIdUsuario().intValue());
                                objAgenda.setCagNombreUsuario(user.getUser().getAdmMedico().getAmeNombreFull());
                                objAgenda.setCagIdInstitucion(user.getUser().getAdmMedico().getAdmInstitucion().getIdInstitucion());
                                objAgenda.setCagNombreInstitucion(user.getUser().getAdmMedico().getAdmInstitucion().getNombre());
                                //Verifica que no se repita el numero de turno
                                if (!hcAdmin.existePorCampo(CexAgenda.class, "cagFecha", fechaCita, "cexHorariosDia", cexAgenda.getCexHorariosDia(), "cagSecuencia", objAgenda.getCagSecuencia(), "cagEstado", 1)) {
                                    hcAdmin.crearTurno(objAgenda, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                    // verifica si el turno esta en base de datos
                                    //print(objAgenda);
                                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Turno asignado correctamente", "Turno asignado correctamente"));
                                    break;
                                } else {
                                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Turno no asignado", "Ya se encuentra un paciente asignado al turno seleccionado"));
                                    return null;
                                }
                            } else {
                                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Turno no asignado", "Paciente ya tiene registrado turno con el medico seleccionado"));
                                return null;
                            }
                        }
                    }
                }

            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }

            //Recuperar objeto para actualizar la lista
            //Recuperar las agendas de acuerdo al horarioDia y de acuerdo a las fechas
            listaAgenda.clear();
            listarturnos(fechaCita, 0);
        } catch (Exception e) {
            log.error("asignarTurno() {} ", e.getMessage());

        }

        return null;
    }

    @Override
    public DataModel<CexConsulta> getDataModel() {
        return null;
    }

    public CexConsulta getAnteriorConsulta() {
        return anteriorConsulta;
    }

    public void setAnteriorConsulta(CexConsulta anteriorConsulta) {
        this.anteriorConsulta = anteriorConsulta;
    }

    public boolean isIsGrabar() {
        return isGrabar;
    }

    public void setIsGrabar(boolean isGrabar) {
        this.isGrabar = isGrabar;
    }

    public AdmUsuario getUsuario() {
        return usuario;
    }

    public void setUsuario(AdmUsuario usuario) {
        this.usuario = usuario;
    }

    public CexPreparacion getPreparacion() {
        return preparacion;
    }

    public void setPreparacion(CexPreparacion preparacion) {
        this.preparacion = preparacion;
    }

    public List<CexRevisionOrganos> getListaOrganos() {
        return listaOrganos;
    }

    public void setListaOrganos(List<CexRevisionOrganos> listaOrganos) {
        this.listaOrganos = listaOrganos;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    public List<CexExamenFisico> getListaFisico() {
        return listaFisico;
    }

    public void setListaFisico(List<CexExamenFisico> listaFisico) {
        this.listaFisico = listaFisico;
    }

    public CexDiagnosticoConsulta getDiagnostico1() {
        return diagnostico1;
    }

    public void setDiagnostico1(CexDiagnosticoConsulta diagnostico1) {
        this.diagnostico1 = diagnostico1;
    }

    public List<CexDiagnosticoConsulta> getListaDiagnostico() {
        return listaDiagnostico;
    }

    public void setListaDiagnostico(List<CexDiagnosticoConsulta> listaDiagnostico) {
        this.listaDiagnostico = listaDiagnostico;
    }

    public List<CexAntecedentesPatologicos> getListaPatologia() {
        return listaPatologia;
    }

    public void setListaPatologia(List<CexAntecedentesPatologicos> listaPatologia) {
        this.listaPatologia = listaPatologia;
    }

    public List<CexAntecedentesFamiliares> getListaPatologiaF() {
        return listaPatologiaF;
    }

    public void setListaPatologiaF(List<CexAntecedentesFamiliares> listaPatologiaF) {
        this.listaPatologiaF = listaPatologiaF;
    }

    public String getBusquedaDiagnostico() {
        return busquedaDiagnostico;
    }

    public void setBusquedaDiagnostico(String busquedaDiagnostico) {
        this.busquedaDiagnostico = busquedaDiagnostico;
    }

    public int getTipoBusquedaDiagnostico() {
        return tipoBusquedaDiagnostico;
    }

    public void setTipoBusquedaDiagnostico(int tipoBusquedaDiagnostico) {
        this.tipoBusquedaDiagnostico = tipoBusquedaDiagnostico;
    }

    public List<CexDiagnostico> getListadiagnosticoPopup() {
        return listadiagnosticoPopup;
    }

    public void setListadiagnosticoPopup(List<CexDiagnostico> listadiagnosticoPopup) {
        this.listadiagnosticoPopup = listadiagnosticoPopup;
    }

    public List<CexPreparacion> getListaDetalle() {
        return listaDetalle;
    }

    public void setListaDetalle(List<CexPreparacion> listaDetalle) {
        this.listaDetalle = listaDetalle;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public CexEspecialidadMedico getObjEspecialidadMedico() {
        return objEspecialidadMedico;
    }

    public void setObjEspecialidadMedico(CexEspecialidadMedico objEspecialidadMedico) {
        this.objEspecialidadMedico = objEspecialidadMedico;
    }

    public CexGrupoAtencion getGrupoAtencion() {
        return grupoAtencion;
    }

    public void setGrupoAtencion(CexGrupoAtencion grupoAtencion) {
        this.grupoAtencion = grupoAtencion;
    }

    public boolean isIsDiagPrincipal() {
        return isDiagPrincipal;
    }

    public void setIsDiagPrincipal(boolean isDiagPrincipal) {
        this.isDiagPrincipal = isDiagPrincipal;
    }

    public List<CexGrupoAtencion> getListaGrupoAtencion() {
        return listaGrupoAtencion;
    }

    public void setListaGrupoAtencion(List<CexGrupoAtencion> listaGrupoAtencion) {
        this.listaGrupoAtencion = listaGrupoAtencion;
    }

    public Date getFechaCita() {
        return fechaCita;
    }

    public void setFechaCita(Date fechaCita) {
        this.fechaCita = fechaCita;
    }

    public List<CexAgenda> getListaAgenda() {
        return listaAgenda;
    }

    public void setListaAgenda(List<CexAgenda> listaAgenda) {
        this.listaAgenda = listaAgenda;
    }

    public Integer getTurnosLibres() {
        return turnosLibres;
    }

    public void setTurnosLibres(Integer turnosLibres) {
        this.turnosLibres = turnosLibres;
    }

    public boolean isIsPrevencion() {
        return isPrevencion;
    }

    public void setIsPrevencion(boolean isPrevencion) {
        this.isPrevencion = isPrevencion;
    }

    public List<CexConsulta> getListaAtencionPopup() {
        return listaAtencionPopup;
    }

    public void setListaAtencionPopup(List<CexConsulta> listaAtencionPopup) {
        this.listaAtencionPopup = listaAtencionPopup;
    }

    public boolean isIsVisualizar() {
        return isVisualizar;
    }

    public void setIsVisualizar(boolean isVisualizar) {
        this.isVisualizar = isVisualizar;
    }

    public List<CexSindromeGeriatrico> getListaSindromeGeriatrico() {
        return listaSindromeGeriatrico;
    }

    public void setListaSindromeGeriatrico(List<CexSindromeGeriatrico> listaSindromeGeriatrico) {
        this.listaSindromeGeriatrico = listaSindromeGeriatrico;
    }

    public CexFisicoRegional getCexFisicoRegional() {
        return cexFisicoRegional;
    }

    public void setCexFisicoRegional(CexFisicoRegional cexFisicoRegional) {
        this.cexFisicoRegional = cexFisicoRegional;
    }

    public CexTratamientoConsulta getProcedimiento() {
        return procedimiento;
    }

    public void setProcedimiento(CexTratamientoConsulta procedimiento) {
        this.procedimiento = procedimiento;
    }

    public List<CexTratamientoConsulta> getListaProcedimiento() {
        return listaProcedimiento;
    }

    public void setListaProcedimiento(List<CexTratamientoConsulta> listaProcedimiento) {
        this.listaProcedimiento = listaProcedimiento;
    }

    public CexSindromeGeriatrico getSindromeGer() {
        return sindromeGer;
    }

    public void setSindromeGer(CexSindromeGeriatrico sindromeGer) {
        this.sindromeGer = sindromeGer;
    }

    public List<CexSistemasOrganos> getListaSistemasOrganos() {
        return listaSistemasOrganos;
    }

    public void setListaSistemasOrganos(List<CexSistemasOrganos> listaSistemasOrganos) {
        this.listaSistemasOrganos = listaSistemasOrganos;
    }

    public List<CexSindromeGeriatrico> getListaGeriatricoHistorial() {
        return listaGeriatricoHistorial;
    }

    public void setListaGeriatricoHistorial(List<CexSindromeGeriatrico> listaGeriatricoHistorial) {
        this.listaGeriatricoHistorial = listaGeriatricoHistorial;
    }

    public Date getFechaPedidoLab() {
        return fechaPedidoLab;
    }

    public void setFechaPedidoLab(Date fechaPedidoLab) {
        this.fechaPedidoLab = fechaPedidoLab;
    }

    public CexPedidoLaboratorio getCexPedidoLaboratorio() {
        return cexPedidoLaboratorio;
    }

    public void setCexPedidoLaboratorio(CexPedidoLaboratorio cexPedidoLaboratorio) {
        this.cexPedidoLaboratorio = cexPedidoLaboratorio;
    }

    public List<CexTipoExamenLaboratorio> getListaExamenLaboratorio() {
        return listaExamenLaboratorio;
    }

    public void setListaExamenLaboratorio(List<CexTipoExamenLaboratorio> listaExamenLaboratorio) {
        this.listaExamenLaboratorio = listaExamenLaboratorio;
    }
    
    

}
